package base

import (
	"fmt"
	"math"
)

// 加法
func eval(a, b int, op string) int {
	switch op {
		case "+":
			return a + b
		case "-":
			return a - b
		case "*":
			return a * b
		case "/":
			return a / b
		default:
			panic("您输入的参数错误！:" + op)
	}
}

// 除法 ， 返回结果的同时，顺带返回余数
func div(a, b int) (q , t int)  {
	return a / b, a % b
}

// 成功则返回值， 出错则返回异常
func evalOrErr(a, b int, op string) (q int, err error)  {

	switch op {
		case "+":
			return a + b, nil
		case "-":
			return a - b, nil
		case "*":
			return a * b, nil
		case "/":
			return a / b, nil
		default:
			return 0, fmt.Errorf("您输入的参数错误！%s", op)
	}

	return 0, fmt.Errorf("您输入的参数错误!")
}

// 匿名函数
// 表示 op 是个匿名函数， c，d是个参数
func apply(op func(a, b int) int, c, d int) int {
	// 返回 op 匿名函数的值
	// 把 c，d 当做参数传进去
	return op(c, d)
}

// 计算，返回int
func pwo(a, b int) int {
	return int(math.Pow(float64(a), float64(b)))
}

// 可变参数列表
// 累加函数
func sum (numbers ...int) int  {
	s := 0
	// range 表示每一个元素的坐标
	for i := range numbers {
		s += numbers[i]
	}
	return s
}

func main() {

	fmt.Println(eval(5,2,"-"))
	fmt.Println(div(13,3))

	q, err := evalOrErr(13,2,"-")
	// 如果不为 nil 表示出错了
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(q)
	}

	// 使用匿名函数
	fmt.Println(apply(pwo,3,6))
	fmt.Println(apply(
		func(a, b int) int {
			return int(math.Pow(float64(a), float64(b)))
		},
	3 ,6))


}
